<?php
require_once ("image.php");
// Le 'Data Access Object' d'un ensemble images
class ImageDAO {
	
	// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	// A MODIFIER EN FONCTION DE VOTRE INSTALLATION
	// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	function __construct() {
		$dsn = 'sqlite:E:\Cours\SIL3\ImageMVC\imageDB'; // Data source name
		                                                // dsn = 'sqlite:C:\wamp\www\projetSIL3PHP\imageDB'; // Data source name
		
		$user = ''; // Utilisateur
		$pass = ''; // Mot de passe
		try {
			$this->db = new PDO ( $dsn, $user, $pass ); // $db est un attribut privé d'ImageDAO
		} catch ( PDOException $e ) {
			die ( "Erreur : " . $e->getMessage () );
		}
	}
	
	// Retourne le nombre d'images référencées dans le DAO
	function size() {
		$s = $this->db->query ( 'SELECT COUNT(*) AS nb FROM image' );
		if ($s) {
			$result = $s->fetchAll ();
			return $result [0] ['nb'];
		}
	}
	
	/*
	 * # Retourne un objet image correspondant à l'identifiant function getImage($imgId) { # Verifie que cet identifiant est correct if(!($imgId >=1 and $imgId <=$this->size())) { $size=$this->size(); debug_print_backtrace(); die("<H1>Erreur dans ImageDAO.getImage: imgId=$imgId incorrect</H1>"); } return new Image(self::urlPath.$this->imgEntry[$imgId-1],$imgId);; }
	 */
		/* si $categorie est donnée, on renvoie la première image	*
		 * de la catégorie spécifiée en suivant l'ordre des id		*
		 * $reverse sert à indiquer le sens du parcours, dans le 	*
		 * de la méthode prev() principalement						*/
		function getImage($id, $categorie = null, $reverse = false) {
		if ($categorie == null) {
			$s = $this->db->query ( 'SELECT * FROM image WHERE id=' . $id );
		} else {
			if ($reverse) {
				$s = $this->db->query ( 'SELECT * FROM image WHERE category="' . $categorie . '" AND id<=' . $id . ' ORDER BY id DESC LIMIT 1' );
			} else {
				$s = $this->db->query ( 'SELECT * FROM image WHERE category="' . $categorie . '" AND id>=' . $id . ' ORDER BY id ASC LIMIT 1' );
			}
		}
		if ($s) {
			$result = $s->fetchAll ();
			if (! empty ( $result )) {
				if (substr ( $result [0] ['path'], 0, 7 ) == "http://") {
					$prefix = "";
				} else {
					$prefix = "data/IMG/";
				}
				return new Image ( $prefix . $result [0] ['path'], $result [0] ['id'], $result [0] ['category'], $result [0] ['comment'] );
			} else {
				return $this->getImage ( $id, $categorie, ! $reverse );
			}
		} else {
			print "Error in getImage. id=" . $id . "<br/>";
			$err = $this->db->errorInfo ();
			print $err [2] . "<br/>";
		}
	}
	
	// Fonction retournant toutes les photos persistées en base de donnée
	function getImages() {
		$s = $this->db->query ( "SELECT * From image" );
		if ($s) {
			$result = $s->fetchAll ();
			$returnResult = array();
			foreach ( $result as $iter ) {
				if (substr ( $iter ['path'], 0, 7 ) == "http://") {
					$prefix = "";
				} else {
					$prefix = "data/IMG/";
				}
				$returnResult [] = new Image ( $prefix . $iter ['path'], $iter ['id'], $iter ['category'], $iter ['comment'] );
			}
			return $returnResult;
		} else {
			print "Error in getImages.<br/>";
			$err = $this->db->errorInfo ();
			print $err [2] . "<br/>";
		}
	}
	
	// Fonction retournant toutes les photos ordonnées par ordre ( dans la base de donnée ) pour un album
	function getImagesParAlbums($idAlbum) {
		$s = $this->db->query ( "SELECT * from IMAGE image inner join associationAlbumImage
					aAI on aAI.idImage = image.id WHERE aAI.idAlbum = $idAlbum ORDER BY ordreImage ASC" );
		if ($s) {
			$result = $s->fetchAll ();
			$returnResult = array();
			foreach ( $result as $iter ) {
				if (substr ( $iter ['path'], 0, 7 ) == "http://") {
					$prefix = "";
				} else {
					$prefix = "data/IMG/";
				}
				$returnResult [] = new Image ( $prefix . $iter ['path'], $iter ['id'], $iter ['category'], $iter ['comment'] );
			}
			return $returnResult;
		} else {
			print "Error in getAlbums </br>";
			$err = $this->db->errorInfo ();
			print $err [2] . "<br/>";
		}
	}
	
	// Retourne une image au hazard
	function getRandomImage($categorie = null) {
		return $this->getImage ( rand ( 1, $this->size () ), $categorie );
	}
	
	// Retourne l'objet de la premiere image
	function getFirstImage($categorie = null) {
		return $this->getImage ( 1, $categorie );
	}
	
	// Retourne l'image suivante d'une image
	function getNextImage(image $img, $categorie = null) {
		$id = $img->getId ();
		if ($id < $this->size ()) {
			$img = $this->getImage ( $id + 1, $categorie );
		}
		return $img;
	}
	
	// Retourne l'image précédente d'une image
	function getPrevImage(image $img, $categorie = null) {
		$id = $img->getId ();
		if ($id > 1) {
			$img = $this->getImage ( $id - 1, $categorie, true ); // true pour parcourir les ids en descendant
		}
		return $img;
	}
	
	// saute en avant ou en arrière de $nb images
	// TODO: adapter pour faire le déplacement en tenant compte de la/les catégorie(s)
	function jumpToImage(image $img, $nb, $categorie = null) {
		$id = $img->getId ();
		$id += $nb;
		if ($id < 1) {
			$id = 1;
		} else if ($id > $this->size ()) {
			$id = $this->size ();
		}
		return $this->getImage ( $id, $categorie, $nb < 0 ); // si nb<0 on parcourt les ids en descendant
	}
	
	// Retourne la liste des images consécutives à partir d'une image
	function getImageList(image $img, $nb, $categorie = null) {
		// Verifie que le nombre d'image est non nul
		if ($nb <= 0) {
			debug_print_backtrace ();
			trigger_error ( "Erreur dans ImageDAO.getImageList: nombre d'images nul" );
		}
		$id = $img->getId ();
		$max = $id + $nb;
		while ( $id < $this->size () && $id < $max ) {
			$res [] = $this->getImage ( $id, $categorie );
			$id ++;
		}
		return $res;
	}
	
	// Retourne la liste de toutes les catégories présentes dans la BD
	function getCategories() {
		$s = $this->db->query ( 'SELECT DISTINCT `category` FROM `image`;' );
		if ($s) {
			$result = $s->fetchAll ();
			foreach ( $result as $c ) {
				$return [] = $c ['category'];
			}
			return $return;
		} else {
			print "Error in getImage. id=" . $id . "<br/>";
			$err = $this->db->errorInfo ();
			print $err [2] . "<br/>";
		}
	}
	
	// Edite le commentaire de la photo $imgId
	function editCommentaire(image $img) {
		
		// ré-traitement : échappement des caractères spéciaux
		$sql = "UPDATE `image` SET comment=:newComment WHERE id=:imgId ;";
		$statement = $this->db->prepare ( $sql );
		$newComment = $img->getCommentaire ();
		$imgId = $img->getId ();
		$statement->bindParam ( ":newComment", $newComment );
		$statement->bindParam ( ":imgId", $imgId );
		$s = $statement->execute ();
		if ($s === FALSE) {
			// Requête mal construite
			print "Error in update Query for comments ";
			$err = $this->db->errorInfo ();
			print $err [2] . "<br/>";
		} 
	}
	function insertImage(image $img) {
		$sql = "INSERT INTO `image`(id,path,category,comment) VALUES (:id,:path,:category,:comment);";
		$statement = $this->db->prepare ( $sql );
		$id = $this->getNextDatabaseId ();
		$path = $img->getURL ();
		$category = $img->getCategorie ();
		$comment = $img->getCommentaire ();
		$statement->bindParam ( ":id", $id );
		$statement->bindParam ( ":path", $path );
		$statement->bindParam ( ":category", $category );
		$statement->bindParam ( ":comment", $comment );
		$s = $statement->execute ();
		if ($s === FALSE) {
			// Requête mal construite
			print "Error in insert Query for insertImage ";
			$err = $this->db->errorInfo ();
			print $err [2] . "<br/>";
		} 
	}
	
	/**
	 * **********************************************************************************************
	 * UTILITAIRES *
	 * **********************************************************************************************
	 */
	function getNextDatabaseId() {
		$s = $this->db->query ( 'SELECT MAX(id) as max from `image`;' );
		if ($s) {
			$result = $s->fetch ( PDO::FETCH_ASSOC );
			return (( int ) $result ["max"]) + 1;
		} else {
			print "Error in getNextDatabaseId.<br/>";
			$err = $this->db->errorInfo ();
			print $err [2] . "<br/>";
		}
	}
}

// Test unitaire
// Appeler le code PHP depuis le navigateur avec la variable test
// Exemple : http://localhost/image/model/imageDAO.php?test
if (isset ( $_GET ["test"] )) {
	echo "<H1>Test de la classe ImageDAO</H1>";
	$imgDAO = new ImageDAO ( ".." );
	echo "<p>Creation de l'objet ImageDAO.</p>\n";
	echo "<p>La base contient " . $imgDAO->size () . " images.</p>\n";
	$img = $imgDAO->getFirstImage ();
	echo "La premiere image est : " . $img->getURL () . "</p>\n";
	// Affiche l'image
	echo "<img src=\"" . $img->getURL () . "\"/>\n";
}

?>
